#include<iostream>
#include<string>
using namespace std;
int T,n,q;
const int N = 3e6+10;
int tr[N][62];
int p[N];
int idx = 0;
int getnum(char ch)
{
	if (ch >= 'a' && ch <= 'z') return ch - 'a';
	else if (ch >= 'A' && ch <= 'Z') return ch - 'A' + 26;
	else return ch - '0' + 52;
}
void insert(string s)
{
	int cur = 0;//表示当下这一层
	p[cur]++;//表示初始0位置++，可以表示有多少串
	for (char ch : s)
	{
		int w = getnum(ch);
		if (tr[cur][w] == 0)
		{
			//更新操作
			tr[cur][w] = ++idx;
		}
		cur = tr[cur][w];//cur也走下一层
		p[cur]++;//节点++这个节点表示到达他之前那个线段有多少子串
	}
}
int find(string s)
{
	int cur = 0;
	for (char ch : s)
	{
		int w = getnum(ch);
		if (tr[cur][w] == 0)
		{
			return 0;//没找到
		}
		cur = tr[cur][w];//往下一层走
	}
	return p[cur];
}
int main()
{
	cin >> T;
	while (T--)
	{
		
		//手动清空数据
		for (int i = 0;i <= idx;i++)//注意手动清空这个清空到最后一层就可以了。主要是小于等于idx因为最后一层更改了
		{
			for (int j = 0;j < 62;j++)
			{
				tr[i][j] = 0;
			}
		}
		for (int i = 0;i <= idx;i++)
		{
			p[i] = 0;//p清空的实际上是层数
		}
		idx = 0;//别忘了归零
		cin >> n >> q;
		for (int i = 0;i < n;i++)
		{
			string s;
			cin >> s;
			insert(s);
		}
		while (q--)
		{
			string s;
			cin >> s;
			cout << find(s) << endl;
		}
	}
	return 0;
}